#ifndef JSONPARSE_H
#define JSONPARSE_H

#include <QString>

// 配置文件的存储目录
static const QString ConfigDir = "Config/";
static const QString SerFileName = ConfigDir + "server.json";
static const QString CliFileName = ConfigDir + "client.json";
static const QString LoginFileName = ConfigDir + "login.json";
static const QString InterfaceFile = ConfigDir + "interface.json";

// 客户端配置信息
struct CliConfig
{
    QString serverID;
    QString clientID;
    QString ip;
    QString port;
    QString shmKey;

    QString& operator [](int index);
    inline int size()
    {
        return 5;
    }
};

// 服务器配置信息
struct SerConfig
{
    QString serverID;       // 服务器ID
    QString port;           // 服务器绑定的端口
    QString dbHost;         // 数据库地址
    QString dbPort;         // 数据库端口
    QString dbName;
    QString dbUserName;     // 数据库用户名
    QString dbPasswd;       // 数据库用户密码
    QString shmMaxNode;     // 共享内存节点数据
    QString shmKey;         // 共享内存字符串

    QString& operator [](int index);
    inline int size()
    {
        return 9;
    }
};

// 登录信息
struct LoginInfo
{
    QString id = QString();
    QString pwd = QString();
};

// 单例模式类
class JsonParse
{
public:
    enum Type{Client, Server};

    ///////////////////////////////////////////////
    ///        客户端和服务器端配置文件信息读写
    ///////////////////////////////////////////////
    // 写客户端的配置信息到文件中
    void writeClientConfig(CliConfig cfg);
    // 读客户端配置信息到内存中
    CliConfig readClientConfig();
    // 写服务器的配置信息到文件中
    void writeServerConfig(SerConfig cfg);
    // 读服务器配置信息到内存中
    SerConfig readServerConfig();
    // 判断配置文件是否存在
    bool configIsExist(JsonParse::Type p);

    ///////////////////////////////////////////////
    ///         通信过程中json数据的组织和解析
    ///////////////////////////////////////////////
    // 生成简单的json对象字符串{k:v,k:v,k:v...}
    QByteArray generateSimpleObj(QStringList keys, QStringList values);
    // 通过传递key值, 得到json对象中的value值
    // 字符串格式要求: {k:v,k:v,k:v...}
    QString simpleObjValue(QString json, QString key);

    ///////////////////////////////////////////////
    ///            登录信息配置文件操作
    ///////////////////////////////////////////////
    // 写配置文件保存, 客户端/服务器登录成功之后调用该函数
    void writeLoginInfo(QString id, QString pwd, Type t = Type::Client);
    // 读配置文件信息(窗口显示的时候/角色切换的时候)
    LoginInfo readLoginInfo(Type t = Type::Client);
    // 删除登录配置文件(用户取消了记住密码)
    void delLoginFile();

    ///////////////////////////////////////////////
    ///            生成外联接口的配置文件
    ///////////////////////////////////////////////
    void writeInterfaceJson(QStringList keys, QStringList values);



    // 静态函数
    static JsonParse *getInstance();

private:
    JsonParse();
    JsonParse(JsonParse& json);
    // 创建目录
    bool makeDirectory(QString name = ConfigDir);
    // 写配置文件
    void writeConfig(Type t, void* config);
    // 读配置文件
    void readConfig(Type t, void* config);
private:

    static JsonParse m_json;

};

#endif // JSONPARSE_H
